#include<bits/stdc++.h> 
using namespace std;
//	M&R是一个写一堆程序员每个人写一段程序来控制一幅给定的图里的老鼠移动的比赛，目标是每只
//	老鼠都能吃到尽可能多的大米。首先随机决定Np个程序员的游戏顺序， 然后每Ng个程序员在比赛
//	中组队。团队中最胖的老鼠赢了，然后进入下一轮比赛。所有的输家都在这局获得相同的名次。 
//	每Ng赢家再次分组进入下轮，直到得出最后的胜者。为了简化目标，假设每只老鼠在提交代码后
//	质量就不变了。现在给定一系列体重，以及初始比赛顺序，你需要输出所有人的排行
//1.每个输入包含一个测试用例，对于每个测试用例，第一行包括两个正整数Np≤1000和Ng≤1000，
//	分别是程序员总数和每组最大的人数。如果剩余人少于Ng，则他们一组。
//2.第二行包括Np个不同的非负整数Wi，每个都是老鼠的重量
//3.第三行是玩家的顺序
//4.对于每个测试用例，一行输出最终的排名。
//5.分组遍历
//这题做起来不难，难的是对题目的理解。首先你得知道他这个排名怎么来的，并不是简单的说按照
//轮数来的，而是说某一轮分组个数来的，分k组，这轮败者排名就是k+1了
//第二个理解易错点就是关于比赛顺序，他给的6 0 8指的是第一个出场的是6，而不是说第一个人第
//6个出场，千万别看错 
//其他的就是很基础的，分组找最大，然后输出一下就行，也没有考察性能什么的，属于是阅读理解题 
int NP, NG;
vector<int> now;
vector<int> next_;
int main(){	
	cin>>NP>>NG;
	int o[NP];
	int weight[NP];
	for(int i = 0;i<NP;i++){
		cin>>weight[i];
	}
	for(int i = 0;i<NP;i++){
		cin>>o[i];
		now.push_back(o[i]);
	}
	int r[NP];
	while(now.size()!=1){
		int max_ = 0;
		int len = now.size();
		int rk = len % NG == 0? len/NG+1 : len/NG+2;
		for(unsigned i = 0;i<len;i++){
			r[now[i]] = rk;
			if(i%NG==NG-1 || i==now.size()-1){
				if(weight[now[i]]>=weight[now[max_]]) max_ = i;
				next_.push_back(now[max_]);
				max_ = i+1;
			}
			else{
				if(weight[now[i]]>=weight[now[max_]]) max_ = i;
			}
		}
		now = next_;
		vector<int>().swap(next_);
	}
	r[now[0]]=1;
	for(int i = 0;i<NP;i++){
		cout<<r[i];
		if(i==NP-1) cout<<endl;
		else cout<<" "; 
	}
	return 0;
} 